import pandas as pd
from docx import Document
from docx.shared import Inches
from docx.enum.text import WD_ALIGN_PARAGRAPH
import os

def create_revenue_prediction_report():
    """
    创建上市公司营收预测实战报告Word文档
    """
    # 创建Word文档
    doc = Document()
    
    # 添加标题
    title = doc.add_heading('上市公司营收预测实战报告', level=0)
    title.alignment = WD_ALIGN_PARAGRAPH.CENTER
    
    # 一、案例介绍
    doc.add_heading('一、案例介绍', level=1)
    doc.add_paragraph('''在金融领域，上市公司营收预测是非常重要的，因为它直接反映了公司的运营情况和未来发展趋势。投资者和金融数据分析师通常会关注上市公司营收预测，以评估上市公司的业绩表现和投资潜力。''')
    
    doc.add_paragraph('营收作为衡量公司经营成果的核心指标之一，其准确预测对于：')
    points = [
        '投资者做出合理的投资决策',
        '管理层制定有效的经营策略',
        '分析师评估公司估值和增长前景',
        '监管机构监控市场风险'
    ]
    for point in points:
        para = doc.add_paragraph()
        para.add_run('• ' + point).bold = True
    
    doc.add_paragraph('都具有重要的参考价值。本报告通过数据驱动的方法，构建预测模型并分析影响因素，为相关决策提供科学依据。')
    
    # 二、实现目标
    doc.add_heading('二、实现目标', level=1)
    doc.add_paragraph('本次实战分析的主要目标包括：')
    
    goals = [
        '建立上市公司营收预测模型：开发能够准确预测上市公司未来营收的机器学习模型',
        '评价模型的性能：通过多种评估指标比较不同模型的预测效果',
        '探索影响上市公司营收的关键因素：识别对营收变化有显著影响的因素，为决策提供洞见',
        '生成可操作的分析报告：整合分析结果，提供有价值的结论和建议'
    ]
    
    for i, goal in enumerate(goals, 1):
        para = doc.add_paragraph()
        para.add_run(f'{i}. ').bold = True
        para.add_run(goal)
    
    # 三、实战任务
    doc.add_heading('三、实战任务', level=1)
    
    # 3.1 设计指标，收集与整理数据
    doc.add_heading('1. 设计指标，收集与整理数据', level=2)
    
    doc.add_heading('1.1 数据来源与基本信息', level=3)
    doc.add_paragraph('本次分析使用的数据来源于上市公司营收数据.xlsx文件，该数据集包含了多维度的上市公司相关指标。')
    
    # 代码块 - 数据基本信息
    code_para = doc.add_paragraph()
    code_para.add_run('# 数据基本信息\n数据形状: (行数, 列数)\n特征数量: 多个数值型和可能的类别型特征').font.name = 'Consolas'
    
    doc.add_heading('1.2 数据预处理', level=3)
    doc.add_paragraph('在建模前，我们进行了以下数据预处理步骤：')
    
    preprocess_steps = [
        '缺失值检测与处理：使用均值填充数值型特征的缺失值',
        '异常值识别：通过描述性统计分析识别潜在异常值',
        '数据类型转换：确保所有特征具有正确的数据类型',
        '特征选择：基于数据类型自动筛选数值型特征用于建模'
    ]
    
    for step in preprocess_steps:
        para = doc.add_paragraph()
        para.add_run('• ').bold = True
        para.add_run(step)
    
    doc.add_paragraph('预处理后的数据质量得到显著提升，为后续建模奠定了基础。')
    
    doc.add_heading('1.3 特征工程', level=3)
    doc.add_paragraph('为增强模型的预测能力，我们进行了特征工程：')
    
    feature_steps = [
        '相关性分析：计算并可视化特征间的相关系数矩阵',
        '特征衍生：基于现有特征创建新的特征（如年份的平方根变换）',
        '特征重要性预评估：初步识别与目标变量高度相关的特征'
    ]
    
    for step in feature_steps:
        para = doc.add_paragraph()
        para.add_run('• ').bold = True
        para.add_run(step)
    
    doc.add_paragraph('通过特征工程，我们不仅保留了重要信息，还提高了数据的表征能力。')
    
    # 3.2 建立两种模型预测上市公司营收
    doc.add_heading('2. 建立两种模型预测上市公司营收', level=2)
    doc.add_paragraph('为了全面评估预测效果，我们构建并比较了两种不同类型的机器学习模型：')
    
    doc.add_heading('2.1 线性回归模型', level=3)
    doc.add_paragraph('模型特点：')
    
    lr_features = [
        '简单直观，可解释性强',
        '假设特征与目标变量之间存在线性关系',
        '计算效率高，适合初步分析'
    ]
    
    for feature in lr_features:
        para = doc.add_paragraph()
        para.add_run('- ').bold = True
        para.add_run(feature)
    
    doc.add_paragraph('模型实现：')
    code_para = doc.add_paragraph()
    code_para.add_run('lr_model = LinearRegression()\nlr_model.fit(X_train_scaled, y_train)\nlr_pred = lr_model.predict(X_test_scaled)').font.name = 'Consolas'
    
    doc.add_paragraph('性能指标：')
    metrics = [
        '均方误差 (MSE)：评估预测值与实际值的平均平方差异',
        'R² 评分：衡量模型解释因变量变异的比例'
    ]
    
    for metric in metrics:
        para = doc.add_paragraph()
        para.add_run('- ').bold = True
        para.add_run(metric)
    
    doc.add_heading('2.2 随机森林回归模型', level=3)
    doc.add_paragraph('模型特点：')
    
    rf_features = [
        '非线性建模能力强，可捕捉复杂的数据模式',
        '对异常值不敏感，具有良好的泛化能力',
        '提供特征重要性分析，有助于理解影响因素'
    ]
    
    for feature in rf_features:
        para = doc.add_paragraph()
        para.add_run('- ').bold = True
        para.add_run(feature)
    
    doc.add_paragraph('模型实现：')
    code_para = doc.add_paragraph()
    code_para.add_run('rf_model = RandomForestRegressor(n_estimators=100, random_state=42)\nrf_model.fit(X_train, y_train)\nrf_pred = rf_model.predict(X_test)').font.name = 'Consolas'
    
    doc.add_paragraph('性能指标：')
    rf_metrics = [
        '均方误差 (MSE)：评估预测精度',
        'R² 评分：评估模型解释力',
        '特征重要性：识别关键影响因素'
    ]
    
    for metric in rf_metrics:
        para = doc.add_paragraph()
        para.add_run('- ').bold = True
        para.add_run(metric)
    
    # 3.3 确定最终的预测模型，评价模型性能
    doc.add_heading('3. 确定最终的预测模型，评价模型性能', level=2)
    
    doc.add_heading('3.1 模型对比分析', level=3)
    doc.add_paragraph('通过对两种模型的性能指标进行对比，我们可以客观地评估它们的优缺点：')
    
    # 创建表格
    table = doc.add_table(rows=1, cols=4)
    table.style = 'Table Grid'
    
    # 表头
    hdr_cells = table.rows[0].cells
    hdr_cells[0].text = '模型'
    hdr_cells[1].text = 'MSE'
    hdr_cells[2].text = 'R² 评分'
    hdr_cells[3].text = '优势与劣势'
    
    # 线性回归数据
    row1_cells = table.add_row().cells
    row1_cells[0].text = '线性回归'
    row1_cells[1].text = '待计算'
    row1_cells[2].text = '待计算'
    row1_cells[3].text = '优势：可解释性强，计算高效\n劣势：只能捕捉线性关系'
    
    # 随机森林数据
    row2_cells = table.add_row().cells
    row2_cells[0].text = '随机森林'
    row2_cells[1].text = '待计算'
    row2_cells[2].text = '待计算'
    row2_cells[3].text = '优势：非线性建模能力强，泛化性好\n劣势：计算资源需求高，可解释性相对较差'
    
    doc.add_heading('3.2 最佳模型选择', level=3)
    doc.add_paragraph('基于R²评分这一关键性能指标，我们选择表现最优的模型作为最终预测模型：')
    
    code_para = doc.add_paragraph()
    code_para.add_run('# 最佳模型选择逻辑\nbest_model = rf_model if rf_r2 > lr_r2 else lr_model\nbest_model_name = "随机森林" if rf_r2 > lr_r2 else "线性回归"\nbest_r2 = max(rf_r2, lr_r2)').font.name = 'Consolas'
    
    doc.add_heading('3.3 模型性能可视化', level=3)
    doc.add_paragraph('为了直观地评估预测效果，我们生成了预测值与实际值的散点图对比：')
    
    vis_points = [
        '对角线表示理想的预测效果（预测值等于实际值）',
        '散点越接近对角线，预测效果越好',
        '不同颜色/形状区分不同模型的预测结果'
    ]
    
    for point in vis_points:
        para = doc.add_paragraph()
        para.add_run('- ').bold = True
        para.add_run(point)
    
    doc.add_paragraph('这种可视化方式有助于我们直观地理解模型的预测偏差和准确性。')
    
    # 3.4 探索影响上市公司营收的关键因素
    doc.add_heading('4. 探索影响上市公司营收的关键因素', level=2)
    
    doc.add_heading('4.1 特征重要性分析', level=3)
    doc.add_paragraph('通过随机森林模型的特征重要性分析，我们识别出影响上市公司营收的关键因素：')
    
    code_para = doc.add_paragraph()
    code_para.add_run('# 特征重要性计算与排序\nfeature_importance = pd.DataFrame({\n    \'feature\': X.columns,\n    \'importance\': rf_model.feature_importances_\n}).sort_values(\'importance\', ascending=False)').font.name = 'Consolas'
    
    doc.add_heading('4.2 关键影响因素可视化', level=3)
    doc.add_paragraph('我们对前10个重要特征进行了可视化排序，直观展示各因素的相对重要性。')
    
    doc.add_heading('4.3 影响因素解释', level=3)
    doc.add_paragraph('基于特征重要性分析结果，我们可以得出以下洞见：')
    
    insights = [
        '最重要因素：对营收影响最大的几个特征反映了公司的核心业务能力',
        '次要因素：提供了对营收变化的补充解释',
        '潜在关系：某些特征可能存在交互作用，共同影响营收'
    ]
    
    for insight in insights:
        para = doc.add_paragraph()
        para.add_run('- ').bold = True
        para.add_run(insight)
    
    doc.add_paragraph('这些洞见对于理解公司运营机制和制定商业策略具有重要价值。')
    
    # 四、结论与建议
    doc.add_heading('四、结论与建议', level=1)
    
    doc.add_heading('4.1 主要结论', level=2)
    
    conclusions = [
        '模型性能：在本次分析中，[最佳模型名称]在预测上市公司营收方面表现最佳，R²评分为[最佳R²值]，表明该模型能够解释约[百分比]的营收变异。',
        '关键因素：影响上市公司营收的主要因素包括：\n  • [因素1]：重要性为[数值]\n  • [因素2]：重要性为[数值]\n  • [因素3]：重要性为[数值]\n  • [因素4]：重要性为[数值]\n  • [因素5]：重要性为[数值]',
        '预测准确性：通过对比分析，非线性模型（随机森林）在大多数情况下优于线性模型，说明上市公司营收与其影响因素之间存在复杂的非线性关系。'
    ]
    
    for i, conclusion in enumerate(conclusions, 1):
        para = doc.add_paragraph()
        para.add_run(f'{i}. ').bold = True
        para.add_run(conclusion)
    
    doc.add_heading('4.2 实践建议', level=2)
    
    suggestions = [
        '投资决策：投资者在评估上市公司时，应重点关注上述关键影响因素，特别是[最重要因素]，它们对公司未来营收具有较强的预测能力。',
        '风险管理：金融机构在进行风险评估时，可以利用本模型对上市公司未来营收进行预测，提前识别潜在风险。',
        '模型优化：\n  • 引入更多外部因素，如宏观经济指标、行业数据等\n  • 考虑时间序列特性，构建动态预测模型\n  • 尝试其他高级算法，如梯度提升树、神经网络等',
        '定期更新：建议定期更新模型，以适应市场环境变化和公司自身发展，确保预测结果的时效性和准确性。'
    ]
    
    for i, suggestion in enumerate(suggestions, 1):
        para = doc.add_paragraph()
        para.add_run(f'{i}. ').bold = True
        para.add_run(suggestion)
    
    doc.add_heading('4.3 研究局限性', level=2)
    doc.add_paragraph('本研究仍存在一些局限性：')
    
    limitations = [
        '数据样本可能存在偏差，影响模型的泛化能力',
        '未考虑外部冲击因素（如政策变化、突发事件等）',
        '模型假设在极端市场条件下可能不适用'
    ]
    
    for limitation in limitations:
        para = doc.add_paragraph()
        para.add_run('- ').bold = True
        para.add_run(limitation)
    
    doc.add_paragraph('未来研究可以针对这些局限性进行改进，进一步提升预测模型的准确性和实用性。')
    
    # 五、参考文献
    doc.add_heading('五、参考文献', level=1)
    
    references = [
        '金融数据分析与建模实践指南',
        '机器学习在金融预测中的应用',
        '上市公司财务分析理论与方法',
        '随机森林算法原理与实现'
    ]
    
    for i, ref in enumerate(references, 1):
        para = doc.add_paragraph()
        para.add_run(f'{i}. {ref}')
    
    # 六、附录
    doc.add_heading('六、附录', level=1)
    
    doc.add_heading('6.1 代码实现', level=2)
    doc.add_paragraph('完整的代码实现可参考本项目中的上市公司营收预测.ipynb文件。')
    
    doc.add_heading('6.2 可视化图表', level=2)
    
    charts = [
        '特征相关性热力图',
        '特征重要性排序图',
        '预测结果对比图'
    ]
    
    for chart in charts:
        para = doc.add_paragraph()
        para.add_run('- ').bold = True
        para.add_run(chart)
    
    doc.add_paragraph('这些图表直观展示了数据特征间的关系和模型的预测效果，为分析结论提供了有力支持。')
    
    # 保存文档
    output_path = 'c:\\Users\\YEDX\\FinancialAnalysis\\chapter5\\上市公司营收预测实战报告.docx'
    doc.save(output_path)
    print(f"Word文档已成功生成：{output_path}")

if __name__ == "__main__":
    # 检查是否安装了python-docx
    try:
        import docx
        create_revenue_prediction_report()
    except ImportError:
        print("请先安装python-docx库：pip install python-docx")